<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文用户手册: 编辑特殊文件</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/usr_23.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>usr_23</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="usr_23.txt">usr_23.txt</a> </b>    适用于 Vim 9.0 版本。   最近更新: 2020年12月

                     <code class="vim">VIM 用户手册 - by Bram Moolenaar</code>
                                <code class="vim">译者</code>: Chimin Yen

                             编辑特殊文件


本章讨论特殊文件的编辑。利用 Vim 你可以编辑经过压缩或加密的文件。有些文件需要
在互联网上存取。二进制文件也能有限度地编辑。

 <a href="usr_23.html#23.1">23.1</a>   DOS、Mac 和 Unix 文件
 <a href="usr_23.html#23.2">23.2</a>   互联网上的文件
 <a href="usr_23.html#23.3">23.3</a>   加密
 <a href="usr_23.html#23.4">23.4</a>   二进制文件
 <a href="usr_23.html#23.5">23.5</a>   压缩文件

        下一章:  <a href="usr_24.html#usr_24.txt">usr_24.txt</a>   快速插入
        前一章:  <a href="usr_22.html#usr_22.txt">usr_22.txt</a>   寻找要编辑的文件
          目录:  <a href="usr_toc.html#usr_toc.txt">usr_toc.txt</a> 

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="23.1">23.1</a> </b>  DOS、Mac 和 Unix 文件</h4>
很久以前，老式的电传打字机使用两个字符来另起新行。一个字符把滑动架移回首位 (称
为回车，<code class="special">&lt;CR&gt;</code>)，另一个字符把纸上移一行 (称为换行，<code class="special">&lt;LF&gt;</code>)。
   当计算机问世以后，存储器曾经非常昂贵。有些人就认定没必要用两个字符来表示行
尾。UNIX 开发者决定他们可以用 &lt;New Line&gt; 或 <code class="special">&lt;NL&gt;</code> 一个字符来表示行尾。Apple 开
发者规定了用 <code class="special">&lt;CR&gt;</code>。开发 Microsoft Windows 的那些家伙则决定沿用老式的 <code class="special">&lt;CR&gt;</code><code class="special">&lt;NL&gt;</code>
(在帮助文本我们使用 <code class="special">&lt;NL&gt;</code> 代表换行符)。
   那意味着，如果你试图把一个文件从一种系统移到另一种系统，那么你就有换行符方
面的麻烦。Vim 编辑器自动识别不同文件格式，并且不劳你操心就把事情给办妥了。
   选项 <a href="options.html#'fileformats'">'fileformats'</a> 包含各种各样的格式，Vim 会在编辑一个新文件之初尝试该选项
定义的各种格式。例如，下面这个命令告诉 Vim 先尝试用 UNIX 格式，其次，尝试
MS-DOS 格式: 
<code class="example"></code>
<code class="example">        :set fileformats=unix,dos</code>
<code class="example"></code>
编辑一个文件时，你将<code class="note">注意</code>到 Vim 给出的信息中包括文件所用的格式。如果你编辑的是
本地格式文件 (你编辑的文件格式和所用系统一致)，你就不会看到任何格式名。
因此在 Unix 系统上编辑一个 Unix 格式文件不会产生任何关于格式的信息。但你若编辑
一个 dos 文件，Vim 将这样通知你:

<code class="section">        "/tmp/test" <code class="special">[dos]</code> 3L，71C </code>

如果是 Mac 文件，你会看到 "[mac]"。
   探测到的文件格式会被存入 <a href="options.html#'fileformat'">'fileformat'</a> 选项。执行下面这个命令可以显示你当前
使用的文件格式: 
<code class="example"></code>
<code class="example">        :set fileformat?</code>
<code class="example"></code>
Vim 能使用的三种格式如下:

        unix            <code class="special">&lt;NL&gt;</code>
        dos             <code class="special">&lt;CR&gt;</code><code class="special">&lt;NL&gt;</code>
        mac             <code class="special">&lt;CR&gt;</code>


使 用 MAC 格 式

在 Unix 上，<code class="special">&lt;NL&gt;</code> 用于分行。但 <code class="special">&lt;CR&gt;</code> 字符混在文本行中间也非罕见。这种情况碰巧经
常发生在 Vi (和 Vim) 脚本内。
   在采用 <code class="special">&lt;CR&gt;</code> 作为换行符的 Macintosh 上，<code class="special">&lt;NL&gt;</code> 字符也有可能混在文本行中间。
   结果，很难 100% 肯定一个同时包含 <code class="special">&lt;CR&gt;</code> 和 <code class="special">&lt;NL&gt;</code> 的文件究竟是 Mac 还是 Unix 格
式。所以，Vim 假设你一般不会在 Unix 上编辑一个 Mac 文件，所以干脆对这种文件格
式不作检查。果真要检查此种格式，就把 "mac" 加入 <a href="options.html#'fileformats'">'fileformats'</a>: 
<code class="example"></code>
<code class="example">        :set fileformats+=mac</code>
<code class="example"></code>
然后 Vim 就会猜测文件格式。要当心，Vim 可能会猜错的。


强 制 格 式

如果你用往日美好的 Vi 来尝试编辑一个采用 MS-DOS 格式的文件，你将会发现每一行的
末尾有个 ^M 字符。(^M 就是 <code class="special">&lt;CR&gt;</code>)。而 Vim 的自动探测功能就避免了这个问题。莫非
你确实要按那个样子来编辑这个文件吗？那么你需要强制 Vim 忽略文件格式而使用你指
定的格式: 
<code class="example"></code>
<code class="example">        :edit ++ff=unix file.txt</code>
<code class="example"></code>
字符串 "++" 告诉 Vim 后面跟的是选项名，以取代其默认值。但仅作用于这一个命令。
"++ff" 用于 <a href="options.html#'fileformat'">'fileformat'</a> 选项。你也可以用 "++ff=mac" 或 "++ff=dos"。
   这样用法并非适用于任意选项，目前 Vim 仅仅实现了 "++ff" 和 "++enc"。用全称
"++fileformat" 和 "++encoding" 也行。


转 换

你可以用 <a href="options.html#'fileformat'">'fileformat'</a> 选项把文件从一种格式转换为另一种。例如，假定你有个名为
README.TXT 的 MS-DOS 文件，你要把它转换成 UNIX 格式。首先编辑这个采用 MS-DOS
格式的文件: 
<code class="example">        vim README.TXT</code>
<code class="example"></code>
Vim 将识别出那是一个 dos 格式文件。现在把这个文件的格式改为 UNIX: 
<code class="example"></code>
<code class="example">        :set fileformat=unix</code>
<code class="example">        :write</code>
<code class="example"></code>
这个文件就以 Unix 格式存盘了。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="23.2">23.2</a> </b>  互联网上的文件</h4>
有人给你传送了一封电子邮件，其中引用了一个以超链接 URL 表示的文件。例如:

<code class="section">        You can find the information here: </code>
<code class="section">                ftp://ftp.vim.org/pub/vim/README </code>

你当然可以启动一个程序来下载这个文件，把它存入你本地磁盘，然后启动 Vim 来编辑
它。
   但有一个简单得多的方法。把光标移到那个超链接里任何一个字符上，然后使用这个
命令: 
<code class="example"></code>
<code class="example">        gf</code>
<code class="example"></code>
运气好的话，Vim 将确定用哪个程序来下载这个文件，并把文件下载下来让你编辑该副
本。在另一个新窗口打开这个文件，则用 <code class="keystroke">CTRL-W</code> f。
   如果事情不顺利的话，你会得到出错信息。可能那个链接有错，也可能你没有阅读它
的权限，还可能网络连接中断了，等等。不幸的是，很难搞清楚出错的原因。你也许得
尝试以手工方法来下载这个文件。

访问因特网上的文件要安装插件 netrw 才行。目前，下面这些格式的超文本链接可被识
别:

        ftp://          使用 ftp
        rcp://          使用 rcp
        scp://          使用 scp
        http://         使用 wget (只读)

Vim 并非亲自与因特网联系。它有赖于你的计算机上安装好的上面提及的程序。大多数
Unix 系统上装有 "ftp" 和 "rcp"。而 "scp" 和 "wget" 也许要另外安装。

无论你用哪个命令开始编辑，Vim 总是会探测一下这些超文本链接。包括如 ":edit" 和
":split" 这样的命令。存盘命令也行，但除了 http:// 之外。

欲知详情，包括密码问题，参见  <a href="pi_netrw.html#netrw">netrw</a> 。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="23.3">23.3</a> </b>  加密</h4>
有些信息你希望保留给自己。例如，当你在计算机上写一份给学生用的试卷。你不会愿意
在考试开始之前给聪明的学生琢磨出一种偷阅试题的方法。Vim 能为你给文件加密，为你
提供一些保护。
   要开始编辑一个需要加密的新文件，可以用 "-x" 参数来启动 Vim。例如: 
<code class="example"></code>
<code class="example">        vim -x exam.txt</code>
<code class="example"></code>
Vim 提示你确定一个密码，用于为文件加密和解密:

<code class="section">        Enter encryption key: </code>

        (<code class="vim">译者注</code>: 中文是
<code class="section">        输入密码: </code>
        )

现在仔细键入那个密码。你所键入的字符将为星号代替，因此你看不到。为了避免由于打
字错误引起麻烦，Vim 要求你再输入一次密码:

<code class="section">        Enter same key again: </code>

        (<code class="vim">译者注</code>: 中文是
<code class="section">        请再输入一次: </code>
        )

现在你可以像平时一样编辑这个文件并把你所有的秘密放进去。当你编完文件要退出 Vim
时，这个文件就被加密存盘了。
   当你用 Vim 编辑这个文件时，它就会要求你再输入那同一个密码。你不需要用 "-x"
参数。你也可以用普通的 ":edit" 命令编辑加密的文件。Vim 给这个文件加上特定的
magic 字符串，据以识别那是经过加密的文件。
   如果你试图用另一个程序来阅读这个文件，你将读到一堆垃圾。如果你用 Vim 来编辑
这个文件，但输入了错误的密码，你也只能得到垃圾。Vim 并不具备检验密码正确性的机
理 (这一点使得破译密码更为困难)。


开 或 关 加 密

要给一个文件撤除加密，设定 <a href="options.html#'key'">'key'</a> 选项为空字符串:

<code class="example">        :set key=</code>
<code class="example"></code>
你下次把这个文件存盘时，存盘的文件就是未经加密的。
   设定 <a href="options.html#'key'">'key'</a> 选项来启用加密是个坏主意。因为密码会被清清楚楚地显示在屏幕上。任
何人都可以偷看到你的密码。
   为了避免这样的问题，创造了 ":X" 命令。它会像 "-x" 参数向你索取一个密码: 
<code class="example"></code>
<code class="example">        :X</code>
<code class="example">        Enter encryption key: ******</code>
<code class="example">        Enter same key again: ******</code>
<code class="example"></code>
<code class="example"></code>
加 密 的 局 限 性

Vim 采用的加密算法不够强大。它对于防止那种偷窥者是绰绰有余了，但不足以防止一个
手上有大量时间的密码专家。交换文件和撤销文件中的文本也是加密的。不过，那是按块
进行的，从而可能会缩短破解密码所需的时间。你可以关闭交换文件，但崩溃会丢失您的
工作，因为 Vim 会只在内存里保留所有的文本。关闭撤销文件唯一的缺点是缓冲区卸载
后不能撤销。

   要避免使用交换文件，在命令行上用 -n 参数。例如，要编辑经过加密的文件
"file.txt"，但不用交换文件，请用下面的命令: 
<code class="example"></code>
<code class="example">        vim -x -n file.txt</code>
<code class="example"></code>
如果你已经在编辑这个文件了，那么交换文件 swapfile 可以用下面的命令禁止: 
<code class="example"></code>
<code class="example">        :setlocal noswapfile</code>
<code class="example"></code>
由于没了交换文件，文件复原就不可能了。为了避免失去编辑的成果，要比平时更勤快地
存盘你的文件。

文件在内存中以明文形式存在。因此任何具备权限的人都能进入编辑者的内存浏览，从
而，发现这个文件的内容。
   如果你使用信息文件 viminfo，别忘了文本寄存器的内容也是明明白白写在其中的。
   如果你真的要保证一个文件内容的安全，那么，你必须永远只在一个不联网的可携式
计算机上编辑这个文件，使用优良的加密工具，并且在不用时，把你的计算机锁进一个大
保险箱。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="23.4">23.4</a> </b>  二进制文件</h4>
你可以用 Vim 来编辑二进制文件。Vim 本非为此而设计的，因而有若干局限。但你能读
取一个文件，改动一个字符，然后把它存盘。结果是你的文件就只有那一个字符给改了，
其它的就跟原来那个一模一样。
   要保证 Vim 别把它那些聪明的窍门用错地方，启动 Vim 时加上 "-b" 参数: 
<code class="example"></code>
<code class="example">        vim -b datafile</code>
<code class="example"></code>
这个参数设定了 <a href="options.html#'binary'">'binary'</a> 选项。其作用是排除所有的意外副作用。例如，<a href="options.html#'textwidth'">'textwidth'</a>
设为零，免得文本行给擅自排版了。并且，文件一律以 Unix 文件格式读取。

二进制模式可以用来修改某程序的消息报文。小心别插入或删除任何字符，那会让程序运
行出问题。用 "R" 命令进入替换模式。

文件里的很多字符都是不可显示的。用 Hex 格式来显示它们的值: 
<code class="example"></code>
<code class="example">        :set display=uhex</code>
<code class="example"></code>
另外，也可以用命令 "ga"  来显示光标下的字符值。当光标位于一个 <code class="special">&lt;Esc&gt;</code> 字符上时，
该命令的输出看起来就像这样:

<code class="section">        &lt;^[&gt;  27， Hex 1b,  Octal 033 </code>

文件中也许没那么多换行符。你可以关闭 <a href="options.html#'wrap'">'wrap'</a> 选项来获得总览的效果: 
<code class="example"></code>
<code class="example">        :set nowrap</code>
<code class="example"></code>
<code class="example"></code>
字 节 位 置

要发现你在文件中的当前字节位置，请用这个命令: 
<code class="example"></code>
<code class="example">        g CTRL-G</code>
<code class="example"></code>
其输出十分冗长:

<code class="section">    Col 9-16 of 9-16; Line 277 of 330; Word 1806 of 2058; Byte 10580 of 12206 </code>

最后两个数字就是文件中的当前字节位置和文件字节总数。这已经考虑了 <a href="options.html#'fileformat'">'fileformat'</a>
选项导致换行符字节不同的影响。
    要移到文件中某个指定的字节，请用 "go" 命令。例如，要移到字节 2345: 
<code class="example"></code>
<code class="example">        2345go</code>
<code class="example"></code>
<code class="example"></code>
使 用 XXD

一个真正的二进制编辑器用两种方式来显示文本: 二进制和十六进制格式。你可以在 Vim
里通过转换程序 "xxd" 来达到这效果。该程序是随 Vim 一起发布的。
   首先以二进制方式编辑这个文件: 
<code class="example"></code>
<code class="example">        vim -b datafile</code>
<code class="example"></code>
现在用 xxd 把这个文件转换成十六进制: 
<code class="example"></code>
<code class="example">        :%!xxd</code>
<code class="example"></code>
文本看起来像这样:

<code class="section">        0000000: 1f8b 0808 39d7 173b 0203 7474 002b 4e49  ....9..;..tt.+NI </code>
<code class="section">        0000010: 4b2c 8660 eb9c ecac c462 eb94 345e 2e30  K,.`.....b..4^.0 </code>
<code class="section">        0000020: 373b 2731 0b22 0ca6 c1a2 d669 1035 39d9  7;'1.".....i.59. </code>

现在你可以随心所欲地阅读和编辑这些文本了。 Vim 把这些信息当作普通文本来对待。
修改了十六进制部分并不导致可显示字符部分的改变，反之亦然。
   最后，用下面的命令把它转换回来:

<code class="example">        :%!xxd -r</code>
<code class="example"></code>
只有十六进制部分的修改才会被采用。右边可显示文本部分的修改忽略不计。

欲知更多详情，参见 xxd 手册。

</section><hr class="doubleline" /><section class=inner>
<h4><b class="vimtag"> <a name="23.5">23.5</a> </b>  压缩文件</h4>
这很容易: 你可以像编辑任何其它文件一样，来编辑一个经过压缩的文件。插件 "gzip"
负责在你编辑这个文件时把它解压缩，以及在你存盘时再把它压缩起来。
   目前支持的压缩方法有下面这些:

        .Z      compress
        .gz     gzip
        .bz2    bzip2

Vim 调用上面提到的程序来实际完成压缩和解压缩。你也许需要先安装这些程序。

</section><hr class="doubleline" /><section class=inner>
<h4></h4>下一章:  <a href="usr_24.html#usr_24.txt">usr_24.txt</a>   快速插入

版权: 参见  <a href="usr_01.html#manual-copyright">manual-copyright</a>   vim:tw=78:ts=8:noet:ft=help:norl:
</section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
